﻿有一个
m×n 格的迷宫(表示有
	m 行、
	�
	n 列)，其中有可走的也有不可走的，如果用
	1
	1 表示可以走，
	0
	0 表示不可以走，文件读入这
	�
	×
	�
	m×n 个数据和起始点、结束点（起始点和结束点都是用两个数据来描述的，分别表示这个点的行号和列号）。现在要你编程找出所有可行的道路，要求所走的路中没有重复的点，走时只能是上下左右四个方向。如果一条路都不可行，则输出相应信息（用
	−
	1
	−1 表示无路）。

	优先顺序：左上右下。数据保证随机生成。

	输入格式
	第一行是两个数
	�
	,
	�
	(
		1
		<
		�
		,
		�
		<
		15
	)
	m, n(1 < m, n < 15)，接下来是
	�
	m 行
	�
	n 列由
	1
	1 和
	0
	0 组成的数据，最后两行是起始点和结束点。

	输出格式
	所有可行的路径，描述一个点时用
	(
		�
		,
		�
	)
	(x, y) 的形式，除开始点外，其他的都要用->表示方向。

	如果没有一条可行的路则输出
	−
	1
	−1。

	输入输出样例
	输入 #1复制
	5 6
	1 0 0 1 0 1
	1 1 1 1 1 1
	0 0 1 1 1 0
	1 1 1 1 1 0
	1 1 1 0 1 1
	1 1
	5 6
	输出 #1复制
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(2, 4)->(2, 5)->(3, 5)->(3, 4)->(3, 3)->(4, 3)->(4, 4)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(2, 4)->(2, 5)->(3, 5)->(3, 4)->(4, 4)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(2, 4)->(2, 5)->(3, 5)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(2, 4)->(3, 4)->(3, 3)->(4, 3)->(4, 4)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(2, 4)->(3, 4)->(3, 5)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(2, 4)->(3, 4)->(4, 4)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(3, 3)->(3, 4)->(2, 4)->(2, 5)->(3, 5)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(3, 3)->(3, 4)->(3, 5)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(3, 3)->(3, 4)->(4, 4)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(3, 3)->(4, 3)->(4, 4)->(3, 4)->(2, 4)->(2, 5)->(3, 5)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(3, 3)->(4, 3)->(4, 4)->(3, 4)->(3, 5)->(4, 5)->(5, 5)->(5, 6)
	(1, 1)->(2, 1)->(2, 2)->(2, 3)->(3, 3)->(4, 3)->(4, 4)->(4, 5)->(5, 5)->(5, 6)



#include<bits/stdc++.h>
	using namespace std;
int m, n, sx, sy, tx, ty;//分别表示行数列数，起始坐标，终止坐标
//向量数组：完成左上右下搜索：
int xx[4] = { 0,-1,0,1 };
int yy[4] = { -1,0,1,0 };
string path;//记录每种答案
vector<string>ret;//答案数组
void add(string& path, int x, int y) {//符合情况添加到path后面
	path += "(";
	path += to_string(x);
	path += ",";
	path += to_string(y);
	path += ")";
	path += "->";
}
int get_size(int x, int y) {//获得回溯时path要删除的字符长度
	return 5 + to_string(x).size() + to_string(y).size();
}//这里15to_stringsize是2；故这里要判断是一位数还是几位数
void dfs(vector<vector<int>>& v, int i, int j) {
	//递归出口；如果找到终止目标就放入ret，
	//但是此时如果进入这里path已经加入了终止坐标了
	if (i == tx - 1 && j == ty - 1) {
		//去除"->"
		path.pop_back();
		path.pop_back();
		ret.push_back(path);//放入ret
		path += "->";//复原，然后交给回溯操作完成删除
		return;
	}
	for (int k = 0; k <= 3; k++) {//左上右下搜索
		int x = i + xx[k], y = j + yy[k];
		if (x >= 0 && x < m && y >= 0 && y < n && v[x][y] == 1) {
			v[x][y] = 0;//标记，防重
			add(path, x + 1, y + 1);
			dfs(v, x, y);
			//回溯：
			v[x][y] = 1;
			int tmp2 = get_size(x + 1, y + 1);
			while (tmp2--)path.pop_back();
		}

	}

}
int main() {
	cin >> m >> n;
	vector<vector<int>>v(m, vector<int>(n));//不能全局：因为n,m未初始化
	//会崩;也可以是静态；但是注意大小范围即可
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cin >> v[i][j];
		}
	}
	cin >> sx >> sy >> tx >> ty;
	add(path, sx, sy);
	v[sx - 1][sy - 1] = 0;//细节：起始坐标必须标记，因为这个坐标不会在dfs中标记
	dfs(v, sx - 1, sy - 1);
	if (ret.size()) for (int i = 0; i < ret.size(); i++) cout << ret[i] << endl;
	else cout << "-1" << endl;//无路径就-1

	return 0;
}
